package com.kexio.file.entity;

import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.kexio.common.entity.BaseEntity;

/**
 * 文件版本实体类
 * 
 * 对应数据库表 sys_file_version
 * 存储文件的版本历史信息，支持版本回滚
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
@TableName("sys_file_version")
public class FileVersion extends BaseEntity {
    
    /**
     * 版本ID（主键）- UUID字符串
     */
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    
    /**
     * 文件ID
     * 关联 sys_file_info 表
     */
    @TableField("file_id")
    private String fileId;
    
    /**
     * 存储对象ID
     * 关联 sys_storage_object 表
     */
    @TableField("storage_object_id")
    private String storageObjectId;
    
    /**
     * 版本号
     */
    @TableField("version_number")
    private Integer versionNumber;
    
    /**
     * 版本名称（可选）
     */
    @TableField("version_name")
    private String versionName;
    
    /**
     * 版本显示名称
     */
    @TableField("version_display_name")
    private String versionDisplayName;
    
    /**
     * 是否为当前版本
     */
    @TableField("is_current")
    private Boolean isCurrent;
    
    /**
     * 文件名称（当时的名称）
     */
    @TableField("file_name")
    private String fileName;
    
    /**
     * 文件大小（字节）
     */
    @TableField("file_size")
    private Long fileSize;
    
    /**
     * MIME类型
     */
    @TableField("mime_type")
    private String mimeType;
    
    /**
     * 文件内容MD5哈希值
     */
    @TableField("content_md5")
    private String contentMd5;
    
    /**
     * 文件内容SHA256哈希值
     */
    @TableField("content_sha256")
    private String contentSha256;
    
    /**
     * 版本状态：1-正常，2-已删除
     */
    @TableField("status")
    private Integer status;
    
    /**
     * 版本创建者ID
     */
    @TableField("creator_id")
    private String creatorId;
    
    /**
     * 版本创建者名称
     */
    @TableField("creator_name")
    private String creatorName;
    
    /**
     * 版本创建时间
     */
    @TableField("create_version_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createVersionTime;
    
    /**
     * 版本变更说明
     */
    @TableField("change_log")
    private String changeLog;
    
    /**
     * 版本标签（JSON格式存储）
     */
    @TableField("version_tags")
    private String versionTags;
    
    /**
     * 与上一版本的差异信息（可选）
     */
    @TableField("diff_info")
    private String diffInfo;
    
    /**
     * 版本扩展属性（JSON格式存储）
     */
    @TableField("extra_attributes")
    private String extraAttributes;
    
    // ==================== 便捷方法 ====================
    
    /**
     * 判断版本是否有效（状态正常）
     */
    public boolean isValid() {
        return status != null && status == 1;
    }
    
    /**
     * 判断是否为当前版本
     */
    public boolean isCurrent() {
        return isCurrent != null && isCurrent;
    }
    
    /**
     * 判断是否为第一个版本
     */
    public boolean isFirstVersion() {
        return versionNumber != null && versionNumber == 1;
    }
    
    /**
     * 获取版本显示名称（计算方法）
     */
    public String getComputedVersionDisplayName() {
        if (versionDisplayName != null && !versionDisplayName.trim().isEmpty()) {
            return versionDisplayName;
        }
        if (versionName != null && !versionName.trim().isEmpty()) {
            return versionName;
        }
        return "v" + (versionNumber != null ? versionNumber : "0");
    }
    
    /**
     * 获取文件大小的人类可读格式
     */
    public String getHumanReadableSize() {
        if (fileSize == null || fileSize <= 0) {
            return "0 B";
        }
        
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double size = fileSize.doubleValue();
        
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }
        
        return String.format("%.1f %s", size, units[unitIndex]);
    }
    
    // ==================== Getter/Setter ====================
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getFileId() {
        return fileId;
    }
    
    public void setFileId(String fileId) {
        this.fileId = fileId;
    }
    
    public String getStorageObjectId() {
        return storageObjectId;
    }
    
    public void setStorageObjectId(String storageObjectId) {
        this.storageObjectId = storageObjectId;
    }
    
    public Integer getVersionNumber() {
        return versionNumber;
    }
    
    public void setVersionNumber(Integer versionNumber) {
        this.versionNumber = versionNumber;
    }
    
    public String getVersionName() {
        return versionName;
    }
    
    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }
    
    public String getVersionDisplayName() {
        return versionDisplayName;
    }
    
    public void setVersionDisplayName(String versionDisplayName) {
        this.versionDisplayName = versionDisplayName;
    }
    
    public Boolean getIsCurrent() {
        return isCurrent;
    }
    
    public void setIsCurrent(Boolean isCurrent) {
        this.isCurrent = isCurrent;
    }
    
    public String getFileName() {
        return fileName;
    }
    
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    
    public Long getFileSize() {
        return fileSize;
    }
    
    public void setFileSize(Long fileSize) {
        this.fileSize = fileSize;
    }
    
    public String getMimeType() {
        return mimeType;
    }
    
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }
    
    public String getContentMd5() {
        return contentMd5;
    }
    
    public void setContentMd5(String contentMd5) {
        this.contentMd5 = contentMd5;
    }
    
    public String getContentSha256() {
        return contentSha256;
    }
    
    public void setContentSha256(String contentSha256) {
        this.contentSha256 = contentSha256;
    }
    
    public Integer getStatus() {
        return status;
    }
    
    public void setStatus(Integer status) {
        this.status = status;
    }
    
    public String getCreatorId() {
        return creatorId;
    }
    
    public void setCreatorId(String creatorId) {
        this.creatorId = creatorId;
    }
    
    public String getCreatorName() {
        return creatorName;
    }
    
    public void setCreatorName(String creatorName) {
        this.creatorName = creatorName;
    }
    
    public LocalDateTime getCreateVersionTime() {
        return createVersionTime;
    }
    
    public void setCreateVersionTime(LocalDateTime createVersionTime) {
        this.createVersionTime = createVersionTime;
    }
    
    public String getChangeLog() {
        return changeLog;
    }
    
    public void setChangeLog(String changeLog) {
        this.changeLog = changeLog;
    }
    
    public String getVersionTags() {
        return versionTags;
    }
    
    public void setVersionTags(String versionTags) {
        this.versionTags = versionTags;
    }
    
    public String getDiffInfo() {
        return diffInfo;
    }
    
    public void setDiffInfo(String diffInfo) {
        this.diffInfo = diffInfo;
    }
    
    public String getExtraAttributes() {
        return extraAttributes;
    }
    
    public void setExtraAttributes(String extraAttributes) {
        this.extraAttributes = extraAttributes;
    }
    
    @Override
    public String toString() {
        return "FileVersion{" +
                "id='" + id + '\'' +
                ", fileId='" + fileId + '\'' +
                ", storageObjectId='" + storageObjectId + '\'' +
                ", versionNumber=" + versionNumber +
                ", versionName='" + versionName + '\'' +
                ", isCurrent=" + isCurrent +
                ", fileName='" + fileName + '\'' +
                ", fileSize=" + fileSize +
                ", mimeType='" + mimeType + '\'' +
                ", status=" + status +
                ", creatorId='" + creatorId + '\'' +
                ", creatorName='" + creatorName + '\'' +
                ", createVersionTime=" + createVersionTime +
                '}';
    }
}
